#!/bin/bash
set -e
if [ -z "${MountPoint}" ]; then
    EnvFile="../common/0_env.sh"
    # shellcheck source=../common/0_env.sh
    source ${EnvFile}
fi

echo -e "\n***********************************************************************"
echo -e "\t\t$0 : 测试 truncate 命令"
echo -e "***********************************************************************"

tmp_dir="/test_truncate"
abs_tmp_dir="${MountPoint}${tmp_dir}"
abs_tmp_file="${abs_tmp_dir}/tmpfile"

function init_dir()
{
    mkdir -p ${abs_tmp_dir}
    clean_dir ${abs_tmp_dir}
    orcafs-ctl --setpattern --storagepoolid=2 "${abs_tmp_dir}" &> /dev/null
    chown -R root:root ${abs_tmp_dir}
    remove_all_quota_for_dir ${tmp_dir}
}

function test_no_quota()
{
    echo -e "\n------测试没有配额时 truncate 命令修改文件大小------"

    print3s "创建并写文件"
    file_size=2000
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${file_size} count=1 2>/dev/null"

    print3s "测试 truncate 命令"

    file_size=1000
    test_cmd "truncate -s ${file_size} ${abs_tmp_file}"
    exec_tree -s ${abs_tmp_dir}

    file_size=5000
    test_cmd "truncate -s ${file_size} ${abs_tmp_file}"
    exec_tree -s ${abs_tmp_dir}

    file_size=0
    test_cmd "truncate -s ${file_size} ${abs_tmp_file}"
    exec_tree -s ${abs_tmp_dir}
    
    clean_dir ${abs_tmp_dir}
}

function test_truncate_to_smaller()
{
    echo -e "\n------测试普通配额目录：使用 truncate 命令修改文件变小------"
    create_quota ${tmp_dir} "--hardsize=1M" "--hardnum=1000"

print3s "写新文件但是 <不超出> 配额"
    bs_size="4k"
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 2>/dev/null"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
print3s "truncate 修改文件变小"
    bs_size="2k"
    test_cmd "truncate -s ${bs_size} ${abs_tmp_file}"
    sleep_check_usedsize_and_usednum ${tmp_dir}

    bs_size="0"
    test_cmd "truncate -s ${bs_size} ${abs_tmp_file}"
    sleep_check_usedsize_and_usednum ${tmp_dir}

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

function test_truncate_to_larger()
{
    echo -e "\n------测试普通配额目录：使用 truncate 命令修改文件变小------"
    create_quota ${tmp_dir} "--hardsize=1M" "--hardnum=1000"

print3s "写新文件但是 <不超出> 配额"
    bs_size="4k"
    test_cmd "dd if=/dev/zero of=${abs_tmp_file} bs=${bs_size} count=1 2>/dev/null"
    sleep_check_usedsize_and_usednum ${tmp_dir}
    
print3s "truncate 修改文件变大, 但是 <不超出> 配额"
    bs_size="2k"
    test_cmd "truncate -s ${bs_size} ${abs_tmp_file}"
    sleep_check_usedsize_and_usednum ${tmp_dir}

print3s "truncate 修改文件变大, 但是 <超出> 配额"
    bs_size="2M"
    test_error_cmd "truncate -s ${bs_size} ${abs_tmp_file}"
    sleep_check_usedsize_and_usednum ${tmp_dir}

    clean_dir ${abs_tmp_dir}
    remove_quota_dir ${tmp_dir}
}

init_dir
# 测试没有配额时 hardlink
test_no_quota

# 测试写新文件
test_truncate_to_smaller

# 测试覆盖旧文件写 O_TRUNC
test_truncate_to_larger

rm_abs_dir ${abs_tmp_dir}
